// common/res/enter.go
package res

import (
	"blog_server/utils/validate"

	"github.com/gin-gonic/gin"
)

// =============================================================================
// | 类型: Code                                                               |
// | 功能: 定义API响应状态码类型                                              |
// =============================================================================
type Code int

// =============================================================================
// | 常量: API响应状态码                                                      |
// | 功能: 定义系统中使用的标准响应状态码                                     |
// =============================================================================
const (
	SuccessCode     Code = 0    // 成功状态码
	FailValidCode   Code = 1001 // 数据验证失败状态码
	FailServiceCode Code = 1002 // 服务失败状态码
)

// =============================================================================
// | 结构体: Response                                                         |
// | 功能: 通用API响应结构体，用于统一RESTful API的响应格式                   |
// =============================================================================
type Response struct {
	Code Code   `json:"code"` // 状态码：0-成功，非0-失败
	Data any    `json:"data"` // 响应数据
	Msg  string `json:"msg"`  // 消息说明
}

// =============================================================================
// | 变量: empty                                                              |
// | 功能: 定义空的map[string]any，用于响应中不需要数据的场景                 |
// =============================================================================
var empty = map[string]any{}

// =============================================================================
// | 方法: Json                                                               |
// | 参数: @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 将Response结构体以JSON格式返回给客户端                             |
// =============================================================================
func (r Response) Json(c *gin.Context) {
	c.JSON(200, r)
}

// =============================================================================
// | 方法: String                                                             |
// | 返回: @string - 状态码对应的中文描述                                     |
// | 功能: 将状态码转换为对应的中文描述                                       |
// =============================================================================
func (c Code) String() string {
	switch c {
	case SuccessCode:
		return "成功"
	case FailValidCode:
		return "校验失败"
	case FailServiceCode:
		return "服务异常"
	}
	return ""
}

// =============================================================================
// | 函数: Ok                                                                 |
// | 参数: @data - any (响应数据)                                             |
// |       @msg - string (自定义成功消息)                                     |
// |       @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 通用成功响应函数                                                   |
// =============================================================================
func Ok(data any, msg string, c *gin.Context) {
	Response{
		Code: SuccessCode,
		Data: data,
		Msg:  msg,
	}.Json(c)
}

// =============================================================================
// | 函数: OkWithData                                                         |
// | 参数: @data - any (响应数据)                                             |
// |       @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 带数据的成功响应                                                   |
// =============================================================================
func OkWithData(data any, c *gin.Context) {
	Response{
		Code: SuccessCode,
		Data: data,
		Msg:  "成功",
	}.Json(c)
}

// OkWithList 返回带列表数据的成功响应
// 参数:
//
//	list - 列表数据，可以是任意类型的切片或数组
//	count - 数据总数，用于分页显示
//	c - Gin框架的上下文对象
func OkWithList(list any, count int, c *gin.Context) {
	// 构建标准响应结构，包含列表数据和总数
	Response{
		Code: SuccessCode, // 成功状态码
		Data: map[string]any{
			"list":  list,  // 列表数据
			"count": count, // 数据总数
		},
		Msg: "成功", // 成功消息
	}.Json(c) // 返回JSON格式响应
}

// =============================================================================
// | 函数: OkWithMsg                                                          |
// | 参数: @msg - string (自定义成功消息)                                     |
// |       @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 带自定义消息的成功响应                                             |
// =============================================================================
func OkWithMsg(msg string, c *gin.Context) {
	Response{
		Code: SuccessCode,
		Data: empty,
		Msg:  msg,
	}.Json(c)
}

// =============================================================================
// | 函数: FailWithMsg                                                        |
// | 参数: @msg - string (自定义错误消息)                                     |
// |       @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 返回带自定义消息的失败响应                                         |
// =============================================================================
func FailWithMsg(msg string, c *gin.Context) {
	Response{
		Code: FailValidCode,
		Data: empty,
		Msg:  msg,
	}.Json(c)
}

// =============================================================================
// | 函数: FailWithData                                                       |
// | 参数: @data - any (响应数据)                                             |
// |       @msg - string (错误消息)                                           |
// |       @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 返回带数据的失败响应                                               |
// =============================================================================
func FailWithData(data any, msg string, c *gin.Context) {
	Response{
		Code: FailServiceCode,
		Data: data,
		Msg:  msg,
	}.Json(c)
}

// =============================================================================
// | 函数: FailWithCode                                                       |
// | 参数: @code - Code (错误码)                                              |
// |       @c - *gin.Context (Gin框架上下文)                                  |
// | 功能: 返回带错误码的失败响应                                             |
// =============================================================================
func FailWithCode(code Code, c *gin.Context) {
	Response{
		Code: code,
		Data: empty,
		Msg:  code.String(),
	}.Json(c)
}

// FailWithError 处理错误并返回错误消息响应
func FailWithError(err error, c *gin.Context) {
	// 使用验证工具包将错误转换为友好的错误消息
	// msg := validate.ValidateErr(err)
	// 调用FailWithMsg返回带错误消息的失败响应
	// FailWithMsg(msg, c)

	data, msg := validate.ValidateError(err)
	FailWithData(data, msg, c) // 返回带错误数据的失败响应
}
